/*
 * @Author: FanWeiHua
 * @Date: 2021-06-27 14:47:04
 * @LastEditTime: 2021-07-23 15:05:00
 * @Description: 公共方法
 */
const path = require('path');
const fs = require('fs');
const { logColor, isFile, isIndexHtmlJs, copySrcDirToTarDir } = require('../common/util');
const inquirer = require('inquirer');
/**
 * 获取所有项目地址
 */
const getAllProPath = projectPath => {
  // 获取子项目名称和地址
  const folders = fs
    .readdirSync(projectPath)
    .map(folder => {
      // 当前项目路径
      const localPath = path.join(projectPath, folder);
      const folderSta = fs.statSync(localPath);
      if (folderSta.isDirectory()) {
        return {
          path: localPath,
          name: folder
        };
      }
    })
    .filter(folder => folder);
  return folders;
};
/**
 * webpack启动初始化
 */
exports.webpackRunInit = callBack => {
  /**
   * webpack的默认配置
   */
  const webpackDefaultConfig = require('./webpackDefaultConfig');
  // 所有项目列表、获取所有项目地址
  const proList = getAllProPath(path.resolve(__dirname, '../../main/project'));
  if (!proList || proList.length === 0) {
    return console.log(logColor('red'), '错误：请创建项目!!');
  }
  // 执行命令行命令
  inquirer
    .prompt([
      {
        type: 'list',
        message: '请选择一个项目：',
        name: 'name',
        choices: proList.map(folder => folder.name)
      }
    ])
    .then(async answer => {
      // 获取选中的项目
      const project = proList.filter(folder => folder.name === answer.name)[0];
      // 判断每个项目是否包含必须的index.html和index.js
      const state = isIndexHtmlJs(project.path);
      // 判断状态
      if (state) {
        // 定义webpack的打包入口、HtmlWebpackPlugin插件的template入口（同为入口path）
        // webpack的配置
        const webpackConfig = {
          project,
          // 入口
          entry: `${project.path}/index.js`,
          // 模板入口index.html文件
          templatePath: `${project.path}/index.html`,
          // webpack的默认配置
          ...webpackDefaultConfig
        };
        /**
         * 如果是本地访问环境，则改变publicPath
         */
        if (process.env.NODE_ENV === 'local') {
          webpackConfig.publicPath = './';
        }
        // 判断文件是否存在
        const state = await isFile(`${project.path}/webpack.config.js`);
        // 配置项
        let config = {};
        // 判断文件是否存在
        if (state) {
          try {
            // 每个项目的webpack的配置;
            config = require(`${project.path}/webpack.config.js`);
          } catch (e) {
            console.log(logColor('red'), e);
            config = {};
          }
          // 如果是本地访问环境，则改变publicPath
          if (process.env.NODE_ENV === 'local') {
            config.publicPath = './';
          }
        }
        // 往node的process进行全局变量添加配置属性
        process.env.webpackConfig = JSON.stringify({ ...webpackConfig, ...config });
        callBack();
      } else {
        console.log(logColor('red'), '错误：项目内没有包含必要文件!!---（index.html 和 index.js）');
        executeTemPro(project);
      }
    })
    .catch(e => {
      console.log(logColor('yellow'), '警告：程序终止运行！');
    });
};
/**
 * 执行模板程序，目的是快速拷贝已有模板程序到指定项目中
 * @param {*} project 要执行的项目信息
 */
const executeTemPro = project => {
  inquirer
    .prompt([
      {
        type: 'list',
        message: '是否导入模板：',
        name: 'name',
        choices: [{ name: '是' }, { name: '否' }]
      }
    ])
    .then(answer => {
      if (answer && answer.name === '是') {
        // 获取模板列表
        const temList = getAllProPath(path.resolve(__dirname, '../template'));
        inquirer
          .prompt([
            {
              type: 'list',
              message: '导入模板：',
              name: 'name',
              choices: temList.map(folder => folder.name).concat({ name: '取消' })
            }
          ])
          .then(async answer => {
            if (answer.name === '取消') {
              return console.log(logColor('green'), '已取消!!');
            }
            // 获取选中的项目
            const tem = temList.filter(folder => folder.name === answer.name)[0];
            /**
             * 拷贝文件夹内容到另一个文件夹内
             */
            copySrcDirToTarDir(tem.path, project.path, () => {
              return console.log(logColor('green'), '导入完成!!');
            });
          });
      }
    });
};
